const char *name;
guint percentage;
gboolean horizontal;
- gboolean vertical;
+ gboolean swap;
} names[] = {
{ "left", 0, TRUE, FALSE },
{ "right", 100, TRUE, FALSE },
{ "center", 50, TRUE, TRUE },
- { "top", 0, FALSE, TRUE },
- { "bottom", 100, FALSE, TRUE },
- { NULL , 0, TRUE, FALSE }, /* used for numbers */
- { NULL , 50, TRUE, TRUE } /* used for no value */
+ { "top", 0, FALSE, FALSE },
+ { "bottom", 100, FALSE, FALSE },
};
- GtkCssValue *x, *y;
- GtkCssValue **missing;
- guint first, second;
+ GtkCssValue *x = NULL, *y = NULL;
+ gboolean swap = FALSE;
+ guint i;
- for (first = 0; names[first].name != NULL; first++)
+ for (i = 0; i < G_N_ELEMENTS (names); i++)
{
- if (gtk_css_parser_try_ident (parser, names[first].name))
+ if (gtk_css_parser_try_ident (parser, names[i].name))
{
- if (names[first].horizontal)
- {
- x = _gtk_css_number_value_new (names[first].percentage, GTK_CSS_PERCENT);
- missing = &y;
- }
+ if (names[i].horizontal)
+ x = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
else
- {
- y = _gtk_css_number_value_new (names[first].percentage, GTK_CSS_PERCENT);
- missing = &x;
- }
+ y = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ swap = names[i].swap;
break;
}
}
- if (names[first].name == NULL)
+ if (i == G_N_ELEMENTS (names))
{
if (gtk_css_number_value_can_parse (parser))
{
- missing = &y;
x = _gtk_css_number_value_parse (parser,
GTK_CSS_PARSE_PERCENT
| GTK_CSS_PARSE_LENGTH);
}
}
- for (second = 0; names[second].name != NULL; second++)
+ for (i = 0; i < G_N_ELEMENTS (names); i++)
{
- if (gtk_css_parser_try_ident (parser, names[second].name))
+ if (!swap && !names[i].swap)
{
- *missing = _gtk_css_number_value_new (names[second].percentage, GTK_CSS_PERCENT);
+ if (names[i].horizontal && x != NULL)
+ continue;
+ if (!names[i].horizontal && y != NULL)
+ continue;
+ }
+
+ if (gtk_css_parser_try_ident (parser, names[i].name))
+ {
+ if (x)
+ {
+ if (names[i].horizontal && !names[i].swap)
+ {
+ y = x;
+ x = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ }
+ else
+ {
+ y = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ }
+ }
+ else
+ {
+ g_assert (names[i].horizontal || names[i].swap);
+ x = _gtk_css_number_value_new (names[i].percentage, GTK_CSS_PERCENT);
+ }
break;
}
}
- if (names[second].name == NULL)
+ if (i == G_N_ELEMENTS (names))
{
if (gtk_css_number_value_can_parse (parser))
{
- if (missing != &y)
+ if (y != NULL)
{
if (!try)
gtk_css_parser_error_syntax (parser, "Invalid combination of values");
}
else
{
- second++;
- *missing = _gtk_css_number_value_new (50, GTK_CSS_PERCENT);
- }
- }
- else
- {
- if ((names[first].horizontal && !names[second].vertical) ||
- (!names[first].horizontal && !names[second].horizontal))
- {
- if (!try)
- gtk_css_parser_error_syntax (parser, "Invalid combination of values");
- _gtk_css_value_unref (x);
- _gtk_css_value_unref (y);
- return NULL;
+ if (y)
+ x = _gtk_css_number_value_new (50, GTK_CSS_PERCENT);
+ else
+ y = _gtk_css_number_value_new (50, GTK_CSS_PERCENT);
}
}